// copy from jni_sys add arch cfg
#![allow(non_snake_case, non_camel_case_types)]

use std::os::raw::c_char;
use std::os::raw::c_void;

#[cfg(target_arch = "aarch64")]
pub type va_list = [u64; 4usize];
#[cfg(target_arch = "x86_64")]
pub type va_list = [__va_list_tag; 1usize];
#[cfg(target_arch = "x86_64")]
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct __va_list_tag {
	pub gp_offset: ::core::ffi::c_uint,
	pub fp_offset: ::core::ffi::c_uint,
	pub overflow_arg_area: *mut ::core::ffi::c_void,
	pub reg_save_area: *mut ::core::ffi::c_void,
}
#[cfg(target_arch = "arm")]
pub type va_list = u32;
#[cfg(target_arch = "x86")]
pub type va_list = *mut c_char;
#[cfg(target_arch = "wasm32")]
pub type va_list = *mut i32;

pub type jint = i32;
pub type jlong = i64;
pub type jbyte = i8;
pub type jboolean = u8;
pub type jchar = u16;
pub type jshort = i16;
pub type jfloat = f32;
pub type jdouble = f64;
pub type jsize = jint;

pub enum _jobject {}
pub type jobject = *mut _jobject;
pub type jclass = jobject;
pub type jthrowable = jobject;
pub type jstring = jobject;
pub type jarray = jobject;
pub type jbooleanArray = jarray;
pub type jbyteArray = jarray;
pub type jcharArray = jarray;
pub type jshortArray = jarray;
pub type jintArray = jarray;
pub type jlongArray = jarray;
pub type jfloatArray = jarray;
pub type jdoubleArray = jarray;
pub type jobjectArray = jarray;
pub type jweak = jobject;

#[repr(C)]
#[derive(Copy)]
pub union jvalue {
	pub z: jboolean,
	pub b: jbyte,
	pub c: jchar,
	pub s: jshort,
	pub i: jint,
	pub j: jlong,
	pub f: jfloat,
	pub d: jdouble,
	pub l: jobject,
}

impl Clone for jvalue {
	fn clone(&self) -> Self {
		*self
	}
}

pub enum _jfieldID {}
pub type jfieldID = *mut _jfieldID;
pub enum _jmethodID {}
pub type jmethodID = *mut _jmethodID;

#[derive(Clone, Copy)]
#[repr(C)]
pub enum jobjectRefType {
	JNIInvalidRefType = 0,
	JNILocalRefType = 1,
	JNIGlobalRefType = 2,
	JNIWeakGlobalRefType = 3,
}

pub const JNI_FALSE: jboolean = 0;
pub const JNI_TRUE: jboolean = 1;

pub const JNI_OK: jint = 0;
pub const JNI_ERR: jint = -1;
pub const JNI_EDETACHED: jint = -2;
pub const JNI_EVERSION: jint = -3;
pub const JNI_ENOMEM: jint = -4;
pub const JNI_EEXIST: jint = -5;
pub const JNI_EINVAL: jint = -6;

pub const JNI_COMMIT: jint = 1;
pub const JNI_ABORT: jint = 2;

pub const JNI_VERSION_1_1: jint = 0x00010001;
pub const JNI_VERSION_1_2: jint = 0x00010002;
pub const JNI_VERSION_1_4: jint = 0x00010004;
pub const JNI_VERSION_1_6: jint = 0x00010006;
pub const JNI_VERSION_1_8: jint = 0x00010008;

#[repr(C)]
#[derive(Copy)]
pub struct JNINativeMethod {
	pub name: *mut c_char,
	pub signature: *mut c_char,
	pub fnPtr: *mut c_void,
}

impl Clone for JNINativeMethod {
	fn clone(&self) -> Self {
		*self
	}
}

pub type JNIEnv = *const JNINativeInterface_;
pub type JavaVM = *const JNIInvokeInterface_;

#[repr(C)]
#[derive(Copy)]
pub struct JNINativeInterface_ {
	pub reserved0: *mut c_void,
	pub reserved1: *mut c_void,
	pub reserved2: *mut c_void,
	pub reserved3: *mut c_void,
	pub GetVersion: Option<unsafe extern "system" fn(env: *mut JNIEnv) -> jint>,
	pub DefineClass: Option<unsafe extern "system" fn(env: *mut JNIEnv, name: *const c_char, loader: jobject, buf: *const jbyte, len: jsize) -> jclass>,
	pub FindClass: Option<unsafe extern "system" fn(env: *mut JNIEnv, name: *const c_char) -> jclass>,
	pub FromReflectedMethod: Option<unsafe extern "system" fn(env: *mut JNIEnv, method: jobject) -> jmethodID>,
	pub FromReflectedField: Option<unsafe extern "system" fn(env: *mut JNIEnv, field: jobject) -> jfieldID>,
	pub ToReflectedMethod: Option<unsafe extern "system" fn(env: *mut JNIEnv, cls: jclass, methodID: jmethodID, isStatic: jboolean) -> jobject>,
	pub GetSuperclass: Option<unsafe extern "system" fn(env: *mut JNIEnv, sub: jclass) -> jclass>,
	pub IsAssignableFrom: Option<unsafe extern "system" fn(env: *mut JNIEnv, sub: jclass, sup: jclass) -> jboolean>,
	pub ToReflectedField: Option<unsafe extern "system" fn(env: *mut JNIEnv, cls: jclass, fieldID: jfieldID, isStatic: jboolean) -> jobject>,
	pub Throw: Option<unsafe extern "system" fn(env: *mut JNIEnv, obj: jthrowable) -> jint>,
	pub ThrowNew: Option<unsafe extern "system" fn(env: *mut JNIEnv, clazz: jclass, msg: *const c_char) -> jint>,
	pub ExceptionOccurred: Option<unsafe extern "system" fn(env: *mut JNIEnv) -> jthrowable>,
	pub ExceptionDescribe: Option<unsafe extern "system" fn(env: *mut JNIEnv)>,
	pub ExceptionClear: Option<unsafe extern "system" fn(env: *mut JNIEnv)>,
	pub FatalError: Option<unsafe extern "system" fn(env: *mut JNIEnv, msg: *const c_char) -> !>,
	pub PushLocalFrame: Option<unsafe extern "system" fn(env: *mut JNIEnv, capacity: jint) -> jint>,
	pub PopLocalFrame: Option<unsafe extern "system" fn(env: *mut JNIEnv, result: jobject) -> jobject>,
	pub NewGlobalRef: Option<unsafe extern "system" fn(env: *mut JNIEnv, lobj: jobject) -> jobject>,
	pub DeleteGlobalRef: Option<unsafe extern "system" fn(env: *mut JNIEnv, gref: jobject)>,
	pub DeleteLocalRef: Option<unsafe extern "system" fn(env: *mut JNIEnv, obj: jobject)>,
	pub IsSameObject: Option<unsafe extern "system" fn(env: *mut JNIEnv, obj1: jobject, obj2: jobject) -> jboolean>,
	pub NewLocalRef: Option<unsafe extern "system" fn(env: *mut JNIEnv, ref_: jobject) -> jobject>,
	pub EnsureLocalCapacity: Option<unsafe extern "system" fn(env: *mut JNIEnv, capacity: jint) -> jint>,
	pub AllocObject: Option<unsafe extern "system" fn(env: *mut JNIEnv, clazz: jclass) -> jobject>,
	pub NewObject: Option<unsafe extern "C" fn(env: *mut JNIEnv, clazz: jclass, methodID: jmethodID, ...) -> jobject>,
	pub NewObjectV: Option<unsafe extern "system" fn(env: *mut JNIEnv, clazz: jclass, methodID: jmethodID, args: va_list) -> jobject>,
	pub NewObjectA: Option<unsafe extern "system" fn(env: *mut JNIEnv, clazz: jclass, methodID: jmethodID, args: *const jvalue) -> jobject>,
	pub GetObjectClass: Option<unsafe extern "system" fn(env: *mut JNIEnv, obj: jobject) -> jclass>,
	pub IsInstanceOf: Option<unsafe extern "system" fn(env: *mut JNIEnv, obj: jobject, clazz: jclass) -> jboolean>,
	pub GetMethodID: Option<unsafe extern "system" fn(env: *mut JNIEnv, clazz: jclass, name: *const c_char, sig: *const c_char) -> jmethodID>,
	pub CallObjectMethod: Option<unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject, methodID: jmethodID, ...) -> jobject>,
	pub CallObjectMethodV: Option<unsafe extern "system" fn(env: *mut JNIEnv, obj: jobject, methodID: jmethodID, args: va_list) -> jobject>,
	pub CallObjectMethodA: Option<unsafe extern "system" fn(env: *mut JNIEnv, obj: jobject, methodID: jmethodID, args: *const jvalue) -> jobject>,
	pub CallBooleanMethod: Option<unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject, methodID: jmethodID, ...) -> jboolean>,
	pub CallBooleanMethodV: Option<unsafe extern "system" fn(env: *mut JNIEnv, obj: jobject, methodID: jmethodID, args: va_list) -> jboolean>,
	pub CallBooleanMethodA: Option<unsafe extern "system" fn(env: *mut JNIEnv, obj: jobject, methodID: jmethodID, args: *const jvalue) -> jboolean>,
	pub CallByteMethod: Option<unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject, methodID: jmethodID, ...) -> jbyte>,
	pub CallByteMethodV: Option<unsafe extern "system" fn(env: *mut JNIEnv, obj: jobject, methodID: jmethodID, args: va_list) -> jbyte>,
	pub CallByteMethodA: Option<unsafe extern "system" fn(env: *mut JNIEnv, obj: jobject, methodID: jmethodID, args: *const jvalue) -> jbyte>,
	pub CallCharMethod: Option<unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject, methodID: jmethodID, ...) -> jchar>,
	pub CallCharMethodV: Option<unsafe extern "system" fn(env: *mut JNIEnv, obj: jobject, methodID: jmethodID, args: va_list) -> jchar>,
	pub CallCharMethodA: Option<unsafe extern "system" fn(env: *mut JNIEnv, obj: jobject, methodID: jmethodID, args: *const jvalue) -> jchar>,
	pub CallShortMethod: Option<unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject, methodID: jmethodID, ...) -> jshort>,
	pub CallShortMethodV: Option<unsafe extern "system" fn(env: *mut JNIEnv, obj: jobject, methodID: jmethodID, args: va_list) -> jshort>,
	pub CallShortMethodA: Option<unsafe extern "system" fn(env: *mut JNIEnv, obj: jobject, methodID: jmethodID, args: *const jvalue) -> jshort>,
	pub CallIntMethod: Option<unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject, methodID: jmethodID, ...) -> jint>,
	pub CallIntMethodV: Option<unsafe extern "system" fn(env: *mut JNIEnv, obj: jobject, methodID: jmethodID, args: va_list) -> jint>,
	pub CallIntMethodA: Option<unsafe extern "system" fn(env: *mut JNIEnv, obj: jobject, methodID: jmethodID, args: *const jvalue) -> jint>,
	pub CallLongMethod: Option<unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject, methodID: jmethodID, ...) -> jlong>,
	pub CallLongMethodV: Option<unsafe extern "system" fn(env: *mut JNIEnv, obj: jobject, methodID: jmethodID, args: va_list) -> jlong>,
	pub CallLongMethodA: Option<unsafe extern "system" fn(env: *mut JNIEnv, obj: jobject, methodID: jmethodID, args: *const jvalue) -> jlong>,
	pub CallFloatMethod: Option<unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject, methodID: jmethodID, ...) -> jfloat>,
	pub CallFloatMethodV: Option<unsafe extern "system" fn(env: *mut JNIEnv, obj: jobject, methodID: jmethodID, args: va_list) -> jfloat>,
	pub CallFloatMethodA: Option<unsafe extern "system" fn(env: *mut JNIEnv, obj: jobject, methodID: jmethodID, args: *const jvalue) -> jfloat>,
	pub CallDoubleMethod: Option<unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject, methodID: jmethodID, ...) -> jdouble>,
	pub CallDoubleMethodV: Option<unsafe extern "system" fn(env: *mut JNIEnv, obj: jobject, methodID: jmethodID, args: va_list) -> jdouble>,
	pub CallDoubleMethodA: Option<unsafe extern "system" fn(env: *mut JNIEnv, obj: jobject, methodID: jmethodID, args: *const jvalue) -> jdouble>,
	pub CallVoidMethod: Option<unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject, methodID: jmethodID, ...)>,
	pub CallVoidMethodV: Option<unsafe extern "system" fn(env: *mut JNIEnv, obj: jobject, methodID: jmethodID, args: va_list)>,
	pub CallVoidMethodA: Option<unsafe extern "system" fn(env: *mut JNIEnv, obj: jobject, methodID: jmethodID, args: *const jvalue)>,
	pub CallNonvirtualObjectMethod: Option<unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject, clazz: jclass, methodID: jmethodID, ...) -> jobject>,
	pub CallNonvirtualObjectMethodV: Option<unsafe extern "system" fn(env: *mut JNIEnv, obj: jobject, clazz: jclass, methodID: jmethodID, args: va_list) -> jobject>,
	pub CallNonvirtualObjectMethodA: Option<unsafe extern "system" fn(env: *mut JNIEnv, obj: jobject, clazz: jclass, methodID: jmethodID, args: *const jvalue) -> jobject>,
	pub CallNonvirtualBooleanMethod: Option<unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject, clazz: jclass, methodID: jmethodID, ...) -> jboolean>,
	pub CallNonvirtualBooleanMethodV: Option<unsafe extern "system" fn(env: *mut JNIEnv, obj: jobject, clazz: jclass, methodID: jmethodID, args: va_list) -> jboolean>,
	pub CallNonvirtualBooleanMethodA: Option<unsafe extern "system" fn(env: *mut JNIEnv, obj: jobject, clazz: jclass, methodID: jmethodID, args: *const jvalue) -> jboolean>,
	pub CallNonvirtualByteMethod: Option<unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject, clazz: jclass, methodID: jmethodID, ...) -> jbyte>,
	pub CallNonvirtualByteMethodV: Option<unsafe extern "system" fn(env: *mut JNIEnv, obj: jobject, clazz: jclass, methodID: jmethodID, args: va_list) -> jbyte>,
	pub CallNonvirtualByteMethodA: Option<unsafe extern "system" fn(env: *mut JNIEnv, obj: jobject, clazz: jclass, methodID: jmethodID, args: *const jvalue) -> jbyte>,
	pub CallNonvirtualCharMethod: Option<unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject, clazz: jclass, methodID: jmethodID, ...) -> jchar>,
	pub CallNonvirtualCharMethodV: Option<unsafe extern "system" fn(env: *mut JNIEnv, obj: jobject, clazz: jclass, methodID: jmethodID, args: va_list) -> jchar>,
	pub CallNonvirtualCharMethodA: Option<unsafe extern "system" fn(env: *mut JNIEnv, obj: jobject, clazz: jclass, methodID: jmethodID, args: *const jvalue) -> jchar>,
	pub CallNonvirtualShortMethod: Option<unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject, clazz: jclass, methodID: jmethodID, ...) -> jshort>,
	pub CallNonvirtualShortMethodV: Option<unsafe extern "system" fn(env: *mut JNIEnv, obj: jobject, clazz: jclass, methodID: jmethodID, args: va_list) -> jshort>,
	pub CallNonvirtualShortMethodA: Option<unsafe extern "system" fn(env: *mut JNIEnv, obj: jobject, clazz: jclass, methodID: jmethodID, args: *const jvalue) -> jshort>,
	pub CallNonvirtualIntMethod: Option<unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject, clazz: jclass, methodID: jmethodID, ...) -> jint>,
	pub CallNonvirtualIntMethodV: Option<unsafe extern "system" fn(env: *mut JNIEnv, obj: jobject, clazz: jclass, methodID: jmethodID, args: va_list) -> jint>,
	pub CallNonvirtualIntMethodA: Option<unsafe extern "system" fn(env: *mut JNIEnv, obj: jobject, clazz: jclass, methodID: jmethodID, args: *const jvalue) -> jint>,
	pub CallNonvirtualLongMethod: Option<unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject, clazz: jclass, methodID: jmethodID, ...) -> jlong>,
	pub CallNonvirtualLongMethodV: Option<unsafe extern "system" fn(env: *mut JNIEnv, obj: jobject, clazz: jclass, methodID: jmethodID, args: va_list) -> jlong>,
	pub CallNonvirtualLongMethodA: Option<unsafe extern "system" fn(env: *mut JNIEnv, obj: jobject, clazz: jclass, methodID: jmethodID, args: *const jvalue) -> jlong>,
	pub CallNonvirtualFloatMethod: Option<unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject, clazz: jclass, methodID: jmethodID, ...) -> jfloat>,
	pub CallNonvirtualFloatMethodV: Option<unsafe extern "system" fn(env: *mut JNIEnv, obj: jobject, clazz: jclass, methodID: jmethodID, args: va_list) -> jfloat>,
	pub CallNonvirtualFloatMethodA: Option<unsafe extern "system" fn(env: *mut JNIEnv, obj: jobject, clazz: jclass, methodID: jmethodID, args: *const jvalue) -> jfloat>,
	pub CallNonvirtualDoubleMethod: Option<unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject, clazz: jclass, methodID: jmethodID, ...) -> jdouble>,
	pub CallNonvirtualDoubleMethodV: Option<unsafe extern "system" fn(env: *mut JNIEnv, obj: jobject, clazz: jclass, methodID: jmethodID, args: va_list) -> jdouble>,
	pub CallNonvirtualDoubleMethodA: Option<unsafe extern "system" fn(env: *mut JNIEnv, obj: jobject, clazz: jclass, methodID: jmethodID, args: *const jvalue) -> jdouble>,
	pub CallNonvirtualVoidMethod: Option<unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject, clazz: jclass, methodID: jmethodID, ...)>,
	pub CallNonvirtualVoidMethodV: Option<unsafe extern "system" fn(env: *mut JNIEnv, obj: jobject, clazz: jclass, methodID: jmethodID, args: va_list)>,
	pub CallNonvirtualVoidMethodA: Option<unsafe extern "system" fn(env: *mut JNIEnv, obj: jobject, clazz: jclass, methodID: jmethodID, args: *const jvalue)>,
	pub GetFieldID: Option<unsafe extern "system" fn(env: *mut JNIEnv, clazz: jclass, name: *const c_char, sig: *const c_char) -> jfieldID>,
	pub GetObjectField: Option<unsafe extern "system" fn(env: *mut JNIEnv, obj: jobject, fieldID: jfieldID) -> jobject>,
	pub GetBooleanField: Option<unsafe extern "system" fn(env: *mut JNIEnv, obj: jobject, fieldID: jfieldID) -> jboolean>,
	pub GetByteField: Option<unsafe extern "system" fn(env: *mut JNIEnv, obj: jobject, fieldID: jfieldID) -> jbyte>,
	pub GetCharField: Option<unsafe extern "system" fn(env: *mut JNIEnv, obj: jobject, fieldID: jfieldID) -> jchar>,
	pub GetShortField: Option<unsafe extern "system" fn(env: *mut JNIEnv, obj: jobject, fieldID: jfieldID) -> jshort>,
	pub GetIntField: Option<unsafe extern "system" fn(env: *mut JNIEnv, obj: jobject, fieldID: jfieldID) -> jint>,
	pub GetLongField: Option<unsafe extern "system" fn(env: *mut JNIEnv, obj: jobject, fieldID: jfieldID) -> jlong>,
	pub GetFloatField: Option<unsafe extern "system" fn(env: *mut JNIEnv, obj: jobject, fieldID: jfieldID) -> jfloat>,
	pub GetDoubleField: Option<unsafe extern "system" fn(env: *mut JNIEnv, obj: jobject, fieldID: jfieldID) -> jdouble>,
	pub SetObjectField: Option<unsafe extern "system" fn(env: *mut JNIEnv, obj: jobject, fieldID: jfieldID, val: jobject)>,
	pub SetBooleanField: Option<unsafe extern "system" fn(env: *mut JNIEnv, obj: jobject, fieldID: jfieldID, val: jboolean)>,
	pub SetByteField: Option<unsafe extern "system" fn(env: *mut JNIEnv, obj: jobject, fieldID: jfieldID, val: jbyte)>,
	pub SetCharField: Option<unsafe extern "system" fn(env: *mut JNIEnv, obj: jobject, fieldID: jfieldID, val: jchar)>,
	pub SetShortField: Option<unsafe extern "system" fn(env: *mut JNIEnv, obj: jobject, fieldID: jfieldID, val: jshort)>,
	pub SetIntField: Option<unsafe extern "system" fn(env: *mut JNIEnv, obj: jobject, fieldID: jfieldID, val: jint)>,
	pub SetLongField: Option<unsafe extern "system" fn(env: *mut JNIEnv, obj: jobject, fieldID: jfieldID, val: jlong)>,
	pub SetFloatField: Option<unsafe extern "system" fn(env: *mut JNIEnv, obj: jobject, fieldID: jfieldID, val: jfloat)>,
	pub SetDoubleField: Option<unsafe extern "system" fn(env: *mut JNIEnv, obj: jobject, fieldID: jfieldID, val: jdouble)>,
	pub GetStaticMethodID: Option<unsafe extern "system" fn(env: *mut JNIEnv, clazz: jclass, name: *const c_char, sig: *const c_char) -> jmethodID>,
	pub CallStaticObjectMethod: Option<unsafe extern "C" fn(env: *mut JNIEnv, clazz: jclass, methodID: jmethodID, ...) -> jobject>,
	pub CallStaticObjectMethodV: Option<unsafe extern "system" fn(env: *mut JNIEnv, clazz: jclass, methodID: jmethodID, args: va_list) -> jobject>,
	pub CallStaticObjectMethodA: Option<unsafe extern "system" fn(env: *mut JNIEnv, clazz: jclass, methodID: jmethodID, args: *const jvalue) -> jobject>,
	pub CallStaticBooleanMethod: Option<unsafe extern "C" fn(env: *mut JNIEnv, clazz: jclass, methodID: jmethodID, ...) -> jboolean>,
	pub CallStaticBooleanMethodV: Option<unsafe extern "system" fn(env: *mut JNIEnv, clazz: jclass, methodID: jmethodID, args: va_list) -> jboolean>,
	pub CallStaticBooleanMethodA: Option<unsafe extern "system" fn(env: *mut JNIEnv, clazz: jclass, methodID: jmethodID, args: *const jvalue) -> jboolean>,
	pub CallStaticByteMethod: Option<unsafe extern "C" fn(env: *mut JNIEnv, clazz: jclass, methodID: jmethodID, ...) -> jbyte>,
	pub CallStaticByteMethodV: Option<unsafe extern "system" fn(env: *mut JNIEnv, clazz: jclass, methodID: jmethodID, args: va_list) -> jbyte>,
	pub CallStaticByteMethodA: Option<unsafe extern "system" fn(env: *mut JNIEnv, clazz: jclass, methodID: jmethodID, args: *const jvalue) -> jbyte>,
	pub CallStaticCharMethod: Option<unsafe extern "C" fn(env: *mut JNIEnv, clazz: jclass, methodID: jmethodID, ...) -> jchar>,
	pub CallStaticCharMethodV: Option<unsafe extern "system" fn(env: *mut JNIEnv, clazz: jclass, methodID: jmethodID, args: va_list) -> jchar>,
	pub CallStaticCharMethodA: Option<unsafe extern "system" fn(env: *mut JNIEnv, clazz: jclass, methodID: jmethodID, args: *const jvalue) -> jchar>,
	pub CallStaticShortMethod: Option<unsafe extern "C" fn(env: *mut JNIEnv, clazz: jclass, methodID: jmethodID, ...) -> jshort>,
	pub CallStaticShortMethodV: Option<unsafe extern "system" fn(env: *mut JNIEnv, clazz: jclass, methodID: jmethodID, args: va_list) -> jshort>,
	pub CallStaticShortMethodA: Option<unsafe extern "system" fn(env: *mut JNIEnv, clazz: jclass, methodID: jmethodID, args: *const jvalue) -> jshort>,
	pub CallStaticIntMethod: Option<unsafe extern "C" fn(env: *mut JNIEnv, clazz: jclass, methodID: jmethodID, ...) -> jint>,
	pub CallStaticIntMethodV: Option<unsafe extern "system" fn(env: *mut JNIEnv, clazz: jclass, methodID: jmethodID, args: va_list) -> jint>,
	pub CallStaticIntMethodA: Option<unsafe extern "system" fn(env: *mut JNIEnv, clazz: jclass, methodID: jmethodID, args: *const jvalue) -> jint>,
	pub CallStaticLongMethod: Option<unsafe extern "C" fn(env: *mut JNIEnv, clazz: jclass, methodID: jmethodID, ...) -> jlong>,
	pub CallStaticLongMethodV: Option<unsafe extern "system" fn(env: *mut JNIEnv, clazz: jclass, methodID: jmethodID, args: va_list) -> jlong>,
	pub CallStaticLongMethodA: Option<unsafe extern "system" fn(env: *mut JNIEnv, clazz: jclass, methodID: jmethodID, args: *const jvalue) -> jlong>,
	pub CallStaticFloatMethod: Option<unsafe extern "C" fn(env: *mut JNIEnv, clazz: jclass, methodID: jmethodID, ...) -> jfloat>,
	pub CallStaticFloatMethodV: Option<unsafe extern "system" fn(env: *mut JNIEnv, clazz: jclass, methodID: jmethodID, args: va_list) -> jfloat>,
	pub CallStaticFloatMethodA: Option<unsafe extern "system" fn(env: *mut JNIEnv, clazz: jclass, methodID: jmethodID, args: *const jvalue) -> jfloat>,
	pub CallStaticDoubleMethod: Option<unsafe extern "C" fn(env: *mut JNIEnv, clazz: jclass, methodID: jmethodID, ...) -> jdouble>,
	pub CallStaticDoubleMethodV: Option<unsafe extern "system" fn(env: *mut JNIEnv, clazz: jclass, methodID: jmethodID, args: va_list) -> jdouble>,
	pub CallStaticDoubleMethodA: Option<unsafe extern "system" fn(env: *mut JNIEnv, clazz: jclass, methodID: jmethodID, args: *const jvalue) -> jdouble>,
	pub CallStaticVoidMethod: Option<unsafe extern "C" fn(env: *mut JNIEnv, cls: jclass, methodID: jmethodID, ...)>,
	pub CallStaticVoidMethodV: Option<unsafe extern "system" fn(env: *mut JNIEnv, cls: jclass, methodID: jmethodID, args: va_list)>,
	pub CallStaticVoidMethodA: Option<unsafe extern "system" fn(env: *mut JNIEnv, cls: jclass, methodID: jmethodID, args: *const jvalue)>,
	pub GetStaticFieldID: Option<unsafe extern "system" fn(env: *mut JNIEnv, clazz: jclass, name: *const c_char, sig: *const c_char) -> jfieldID>,
	pub GetStaticObjectField: Option<unsafe extern "system" fn(env: *mut JNIEnv, clazz: jclass, fieldID: jfieldID) -> jobject>,
	pub GetStaticBooleanField: Option<unsafe extern "system" fn(env: *mut JNIEnv, clazz: jclass, fieldID: jfieldID) -> jboolean>,
	pub GetStaticByteField: Option<unsafe extern "system" fn(env: *mut JNIEnv, clazz: jclass, fieldID: jfieldID) -> jbyte>,
	pub GetStaticCharField: Option<unsafe extern "system" fn(env: *mut JNIEnv, clazz: jclass, fieldID: jfieldID) -> jchar>,
	pub GetStaticShortField: Option<unsafe extern "system" fn(env: *mut JNIEnv, clazz: jclass, fieldID: jfieldID) -> jshort>,
	pub GetStaticIntField: Option<unsafe extern "system" fn(env: *mut JNIEnv, clazz: jclass, fieldID: jfieldID) -> jint>,
	pub GetStaticLongField: Option<unsafe extern "system" fn(env: *mut JNIEnv, clazz: jclass, fieldID: jfieldID) -> jlong>,
	pub GetStaticFloatField: Option<unsafe extern "system" fn(env: *mut JNIEnv, clazz: jclass, fieldID: jfieldID) -> jfloat>,
	pub GetStaticDoubleField: Option<unsafe extern "system" fn(env: *mut JNIEnv, clazz: jclass, fieldID: jfieldID) -> jdouble>,
	pub SetStaticObjectField: Option<unsafe extern "system" fn(env: *mut JNIEnv, clazz: jclass, fieldID: jfieldID, value: jobject)>,
	pub SetStaticBooleanField: Option<unsafe extern "system" fn(env: *mut JNIEnv, clazz: jclass, fieldID: jfieldID, value: jboolean)>,
	pub SetStaticByteField: Option<unsafe extern "system" fn(env: *mut JNIEnv, clazz: jclass, fieldID: jfieldID, value: jbyte)>,
	pub SetStaticCharField: Option<unsafe extern "system" fn(env: *mut JNIEnv, clazz: jclass, fieldID: jfieldID, value: jchar)>,
	pub SetStaticShortField: Option<unsafe extern "system" fn(env: *mut JNIEnv, clazz: jclass, fieldID: jfieldID, value: jshort)>,
	pub SetStaticIntField: Option<unsafe extern "system" fn(env: *mut JNIEnv, clazz: jclass, fieldID: jfieldID, value: jint)>,
	pub SetStaticLongField: Option<unsafe extern "system" fn(env: *mut JNIEnv, clazz: jclass, fieldID: jfieldID, value: jlong)>,
	pub SetStaticFloatField: Option<unsafe extern "system" fn(env: *mut JNIEnv, clazz: jclass, fieldID: jfieldID, value: jfloat)>,
	pub SetStaticDoubleField: Option<unsafe extern "system" fn(env: *mut JNIEnv, clazz: jclass, fieldID: jfieldID, value: jdouble)>,
	pub NewString: Option<unsafe extern "system" fn(env: *mut JNIEnv, unicode: *const jchar, len: jsize) -> jstring>,
	pub GetStringLength: Option<unsafe extern "system" fn(env: *mut JNIEnv, str: jstring) -> jsize>,
	pub GetStringChars: Option<unsafe extern "system" fn(env: *mut JNIEnv, str: jstring, isCopy: *mut jboolean) -> *const jchar>,
	pub ReleaseStringChars: Option<unsafe extern "system" fn(env: *mut JNIEnv, str: jstring, chars: *const jchar)>,
	pub NewStringUTF: Option<unsafe extern "system" fn(env: *mut JNIEnv, utf: *const c_char) -> jstring>,
	pub GetStringUTFLength: Option<unsafe extern "system" fn(env: *mut JNIEnv, str: jstring) -> jsize>,
	pub GetStringUTFChars: Option<unsafe extern "system" fn(env: *mut JNIEnv, str: jstring, isCopy: *mut jboolean) -> *const c_char>,
	pub ReleaseStringUTFChars: Option<unsafe extern "system" fn(env: *mut JNIEnv, str: jstring, chars: *const c_char)>,
	pub GetArrayLength: Option<unsafe extern "system" fn(env: *mut JNIEnv, array: jarray) -> jsize>,
	pub NewObjectArray: Option<unsafe extern "system" fn(env: *mut JNIEnv, len: jsize, clazz: jclass, init: jobject) -> jobjectArray>,
	pub GetObjectArrayElement: Option<unsafe extern "system" fn(env: *mut JNIEnv, array: jobjectArray, index: jsize) -> jobject>,
	pub SetObjectArrayElement: Option<unsafe extern "system" fn(env: *mut JNIEnv, array: jobjectArray, index: jsize, val: jobject)>,
	pub NewBooleanArray: Option<unsafe extern "system" fn(env: *mut JNIEnv, len: jsize) -> jbooleanArray>,
	pub NewByteArray: Option<unsafe extern "system" fn(env: *mut JNIEnv, len: jsize) -> jbyteArray>,
	pub NewCharArray: Option<unsafe extern "system" fn(env: *mut JNIEnv, len: jsize) -> jcharArray>,
	pub NewShortArray: Option<unsafe extern "system" fn(env: *mut JNIEnv, len: jsize) -> jshortArray>,
	pub NewIntArray: Option<unsafe extern "system" fn(env: *mut JNIEnv, len: jsize) -> jintArray>,
	pub NewLongArray: Option<unsafe extern "system" fn(env: *mut JNIEnv, len: jsize) -> jlongArray>,
	pub NewFloatArray: Option<unsafe extern "system" fn(env: *mut JNIEnv, len: jsize) -> jfloatArray>,
	pub NewDoubleArray: Option<unsafe extern "system" fn(env: *mut JNIEnv, len: jsize) -> jdoubleArray>,
	pub GetBooleanArrayElements: Option<unsafe extern "system" fn(env: *mut JNIEnv, array: jbooleanArray, isCopy: *mut jboolean) -> *mut jboolean>,
	pub GetByteArrayElements: Option<unsafe extern "system" fn(env: *mut JNIEnv, array: jbyteArray, isCopy: *mut jboolean) -> *mut jbyte>,
	pub GetCharArrayElements: Option<unsafe extern "system" fn(env: *mut JNIEnv, array: jcharArray, isCopy: *mut jboolean) -> *mut jchar>,
	pub GetShortArrayElements: Option<unsafe extern "system" fn(env: *mut JNIEnv, array: jshortArray, isCopy: *mut jboolean) -> *mut jshort>,
	pub GetIntArrayElements: Option<unsafe extern "system" fn(env: *mut JNIEnv, array: jintArray, isCopy: *mut jboolean) -> *mut jint>,
	pub GetLongArrayElements: Option<unsafe extern "system" fn(env: *mut JNIEnv, array: jlongArray, isCopy: *mut jboolean) -> *mut jlong>,
	pub GetFloatArrayElements: Option<unsafe extern "system" fn(env: *mut JNIEnv, array: jfloatArray, isCopy: *mut jboolean) -> *mut jfloat>,
	pub GetDoubleArrayElements: Option<unsafe extern "system" fn(env: *mut JNIEnv, array: jdoubleArray, isCopy: *mut jboolean) -> *mut jdouble>,
	pub ReleaseBooleanArrayElements: Option<unsafe extern "system" fn(env: *mut JNIEnv, array: jbooleanArray, elems: *mut jboolean, mode: jint)>,
	pub ReleaseByteArrayElements: Option<unsafe extern "system" fn(env: *mut JNIEnv, array: jbyteArray, elems: *mut jbyte, mode: jint)>,
	pub ReleaseCharArrayElements: Option<unsafe extern "system" fn(env: *mut JNIEnv, array: jcharArray, elems: *mut jchar, mode: jint)>,
	pub ReleaseShortArrayElements: Option<unsafe extern "system" fn(env: *mut JNIEnv, array: jshortArray, elems: *mut jshort, mode: jint)>,
	pub ReleaseIntArrayElements: Option<unsafe extern "system" fn(env: *mut JNIEnv, array: jintArray, elems: *mut jint, mode: jint)>,
	pub ReleaseLongArrayElements: Option<unsafe extern "system" fn(env: *mut JNIEnv, array: jlongArray, elems: *mut jlong, mode: jint)>,
	pub ReleaseFloatArrayElements: Option<unsafe extern "system" fn(env: *mut JNIEnv, array: jfloatArray, elems: *mut jfloat, mode: jint)>,
	pub ReleaseDoubleArrayElements: Option<unsafe extern "system" fn(env: *mut JNIEnv, array: jdoubleArray, elems: *mut jdouble, mode: jint)>,
	pub GetBooleanArrayRegion: Option<unsafe extern "system" fn(env: *mut JNIEnv, array: jbooleanArray, start: jsize, l: jsize, buf: *mut jboolean)>,
	pub GetByteArrayRegion: Option<unsafe extern "system" fn(env: *mut JNIEnv, array: jbyteArray, start: jsize, len: jsize, buf: *mut jbyte)>,
	pub GetCharArrayRegion: Option<unsafe extern "system" fn(env: *mut JNIEnv, array: jcharArray, start: jsize, len: jsize, buf: *mut jchar)>,
	pub GetShortArrayRegion: Option<unsafe extern "system" fn(env: *mut JNIEnv, array: jshortArray, start: jsize, len: jsize, buf: *mut jshort)>,
	pub GetIntArrayRegion: Option<unsafe extern "system" fn(env: *mut JNIEnv, array: jintArray, start: jsize, len: jsize, buf: *mut jint)>,
	pub GetLongArrayRegion: Option<unsafe extern "system" fn(env: *mut JNIEnv, array: jlongArray, start: jsize, len: jsize, buf: *mut jlong)>,
	pub GetFloatArrayRegion: Option<unsafe extern "system" fn(env: *mut JNIEnv, array: jfloatArray, start: jsize, len: jsize, buf: *mut jfloat)>,
	pub GetDoubleArrayRegion: Option<unsafe extern "system" fn(env: *mut JNIEnv, array: jdoubleArray, start: jsize, len: jsize, buf: *mut jdouble)>,
	pub SetBooleanArrayRegion: Option<unsafe extern "system" fn(env: *mut JNIEnv, array: jbooleanArray, start: jsize, l: jsize, buf: *const jboolean)>,
	pub SetByteArrayRegion: Option<unsafe extern "system" fn(env: *mut JNIEnv, array: jbyteArray, start: jsize, len: jsize, buf: *const jbyte)>,
	pub SetCharArrayRegion: Option<unsafe extern "system" fn(env: *mut JNIEnv, array: jcharArray, start: jsize, len: jsize, buf: *const jchar)>,
	pub SetShortArrayRegion: Option<unsafe extern "system" fn(env: *mut JNIEnv, array: jshortArray, start: jsize, len: jsize, buf: *const jshort)>,
	pub SetIntArrayRegion: Option<unsafe extern "system" fn(env: *mut JNIEnv, array: jintArray, start: jsize, len: jsize, buf: *const jint)>,
	pub SetLongArrayRegion: Option<unsafe extern "system" fn(env: *mut JNIEnv, array: jlongArray, start: jsize, len: jsize, buf: *const jlong)>,
	pub SetFloatArrayRegion: Option<unsafe extern "system" fn(env: *mut JNIEnv, array: jfloatArray, start: jsize, len: jsize, buf: *const jfloat)>,
	pub SetDoubleArrayRegion: Option<unsafe extern "system" fn(env: *mut JNIEnv, array: jdoubleArray, start: jsize, len: jsize, buf: *const jdouble)>,
	pub RegisterNatives: Option<unsafe extern "system" fn(env: *mut JNIEnv, clazz: jclass, methods: *const JNINativeMethod, nMethods: jint) -> jint>,
	pub UnregisterNatives: Option<unsafe extern "system" fn(env: *mut JNIEnv, clazz: jclass) -> jint>,
	pub MonitorEnter: Option<unsafe extern "system" fn(env: *mut JNIEnv, obj: jobject) -> jint>,
	pub MonitorExit: Option<unsafe extern "system" fn(env: *mut JNIEnv, obj: jobject) -> jint>,
	pub GetJavaVM: Option<unsafe extern "system" fn(env: *mut JNIEnv, vm: *mut *mut JavaVM) -> jint>,
	pub GetStringRegion: Option<unsafe extern "system" fn(env: *mut JNIEnv, str: jstring, start: jsize, len: jsize, buf: *mut jchar)>,
	pub GetStringUTFRegion: Option<unsafe extern "system" fn(env: *mut JNIEnv, str: jstring, start: jsize, len: jsize, buf: *mut c_char)>,
	pub GetPrimitiveArrayCritical: Option<unsafe extern "system" fn(env: *mut JNIEnv, array: jarray, isCopy: *mut jboolean) -> *mut c_void>,
	pub ReleasePrimitiveArrayCritical: Option<unsafe extern "system" fn(env: *mut JNIEnv, array: jarray, carray: *mut c_void, mode: jint)>,
	pub GetStringCritical: Option<unsafe extern "system" fn(env: *mut JNIEnv, string: jstring, isCopy: *mut jboolean) -> *const jchar>,
	pub ReleaseStringCritical: Option<unsafe extern "system" fn(env: *mut JNIEnv, string: jstring, cstring: *const jchar)>,
	pub NewWeakGlobalRef: Option<unsafe extern "system" fn(env: *mut JNIEnv, obj: jobject) -> jweak>,
	pub DeleteWeakGlobalRef: Option<unsafe extern "system" fn(env: *mut JNIEnv, ref_: jweak)>,
	pub ExceptionCheck: Option<unsafe extern "system" fn(env: *mut JNIEnv) -> jboolean>,
	pub NewDirectByteBuffer: Option<unsafe extern "system" fn(env: *mut JNIEnv, address: *mut c_void, capacity: jlong) -> jobject>,
	pub GetDirectBufferAddress: Option<unsafe extern "system" fn(env: *mut JNIEnv, buf: jobject) -> *mut c_void>,
	pub GetDirectBufferCapacity: Option<unsafe extern "system" fn(env: *mut JNIEnv, buf: jobject) -> jlong>,
	pub GetObjectRefType: Option<unsafe extern "system" fn(env: *mut JNIEnv, obj: jobject) -> jobjectRefType>,
}

impl Clone for JNINativeInterface_ {
	fn clone(&self) -> Self {
		*self
	}
}

#[repr(C)]
#[derive(Copy)]
pub struct JNIEnv_ {
	pub functions: *const JNINativeInterface_,
}

impl Clone for JNIEnv_ {
	fn clone(&self) -> Self {
		*self
	}
}

#[repr(C)]
#[derive(Copy)]
pub struct JavaVMOption {
	pub optionString: *mut c_char,
	pub extraInfo: *mut c_void,
}

impl Clone for JavaVMOption {
	fn clone(&self) -> Self {
		*self
	}
}

#[repr(C)]
#[derive(Copy)]
pub struct JavaVMInitArgs {
	pub version: jint,
	pub nOptions: jint,
	pub options: *mut JavaVMOption,
	pub ignoreUnrecognized: jboolean,
}

impl Clone for JavaVMInitArgs {
	fn clone(&self) -> Self {
		*self
	}
}

#[repr(C)]
#[derive(Copy)]
pub struct JavaVMAttachArgs {
	pub version: jint,
	pub name: *mut c_char,
	pub group: jobject,
}

impl Clone for JavaVMAttachArgs {
	fn clone(&self) -> Self {
		*self
	}
}

#[repr(C)]
#[derive(Copy)]
pub struct JNIInvokeInterface_ {
	pub reserved0: *mut c_void,
	pub reserved1: *mut c_void,
	pub reserved2: *mut c_void,
	pub DestroyJavaVM: Option<unsafe extern "system" fn(vm: *mut JavaVM) -> jint>,
	pub AttachCurrentThread: Option<unsafe extern "system" fn(vm: *mut JavaVM, penv: *mut *mut c_void, args: *mut c_void) -> jint>,
	pub DetachCurrentThread: Option<unsafe extern "system" fn(vm: *mut JavaVM) -> jint>,
	pub GetEnv: Option<unsafe extern "system" fn(vm: *mut JavaVM, penv: *mut *mut c_void, version: jint) -> jint>,
	pub AttachCurrentThreadAsDaemon: Option<unsafe extern "system" fn(vm: *mut JavaVM, penv: *mut *mut c_void, args: *mut c_void) -> jint>,
}

impl Clone for JNIInvokeInterface_ {
	fn clone(&self) -> Self {
		*self
	}
}

extern "system" {
	pub fn JNI_GetDefaultJavaVMInitArgs(args: *mut c_void) -> jint;
	pub fn JNI_CreateJavaVM(pvm: *mut *mut JavaVM, penv: *mut *mut c_void, args: *mut c_void) -> jint;
	pub fn JNI_GetCreatedJavaVMs(vmBuf: *mut *mut JavaVM, bufLen: jsize, nVMs: *mut jsize) -> jint;
}
